Cloud Functions から Stackdriver に log 書く & ログのグループ化(未完)
from Cloud Functions
#blogged 2020/4/8 Cloud Functions でログをグルーピングする - ぽ靴な缶
console.log はjsonPayload にならない?
GAE では Stdout をがんばれば構造化できたが...
console.log({...}) や console.log(JSON.stringify({...})) は textPayload になる
素直に @google-cloud/logging 使ってみる
普通に使えば構造化ログができる
https://gyazo.com/bbed4bed41cd1bf0e8dc51eb0454523d
resouce や timestamp など埋めてくれている
https://github.com/googleapis/nodejs-logging/blob/master/src/log.ts#L807
https://github.com/googleapis/nodejs-logging/blob/857edb6098050d919927ca3cedd54bd22447565b/src/metadata.ts#L147
GAE や Cloud Functions や GCE なら resource を探してくれる
nodejs10 runtime では環境変数から region 取れない
trace は入ってない
Function execution started と紐付けたい
GAE で Stackdriver Logging にログを拾わせてトレースしたい
ここで region が入ってないから Monitored Resource が同一にならないんじゃないかなあ
👉 nodejs8 runtime でやる
起動時のログに httpRequest がないし (httpRequest.requestUrl が親に含まれていないといけない)
Cloud Functions では executionId で紐づく説
なにかのブログで読んだ
Function-Execution-ID はリクエストヘッダに入っている
labels に書き出してもダメ
trace をなんとかしていれる
metadata に入れると起動メッセージと同じ階層に入る
これが分かるまで、labels に入れたり json エントリに入れたり忙しかった
logging.googleapis.com/trace でなく単に trace でないと出ない気がするが...
結局出ない
https://gyazo.com/00295ab34bace2c1469bc7ad9aa11287
ひっつかへんやんけ~~~
https://cloud.google.com/run/docs/logging#correlate-logs はい嘘〜〜〜
まあ stareted ~ finished も紐付いてないしね
GAE でログが紐づく条件 GAE のログに憧れて - google-cloud-jp - Medium と比較
⭕同じ GCP プロジェクト
⭕logID (logName) が別々
⭕Monitored Resource が同一 (resource 以下)
⭕trace が同一
(言及されてないけど) labels.execution_id が同一
GAE と違うとこ
start < log < end ではあるけど、start 自体に終了時刻持ってない
parent に httpRequest フィールドがない
まあこれらが必須なんかな...
次やりたい
express でアクセスログ出す & それにアプリケーションログを紐付ける
make-middleware.ts 使ってみる nodejs-logging/make-middleware.ts at master · googleapis/nodejs-logging
https://github.com/googleapis/nodejs-logging-winston/#using-as-an-express-middleware
nodejs-logging-winston/express.ts at e61dad96f7982ab36a6e680dcf54bbda5ff165e3 · googleapis/nodejs-logging-winston
リンク
logging - GoDoc
"Grouping Logs by Request" のセクション
PubSub トリガなら無理なんかな > Parent entries must have HTTPRequest.Request populated.
CloudFunction も同様
GAE で Stackdriver Logging にログを拾わせてトレースしたい
前やったやつ
Node.js 用 Stackdriver Logging の設定  |  Stackdriver Logging  |  Google Cloud
たんに bunyan するだけでは jsonPayload にならない → これは勘違い
サンプルのやつだと 標準出力と Stackdriver Logging API の 2 箇所に書いて両方拾われる
標準出力のほうは textPayload のまま、API で書かれたほうは jsonPayload になる
winston 版は trace やってくれる節がある?
nodejs-logging-winston/default-metadata.ts at f6bd9dd8b63a6d880b013f8efd8cb516410f1f57 · googleapis/nodejs-logging-winston
bunyan もやってくれそうだけど
nodejs-logging-bunyan/index.ts at 52295e0eb6636c290f23e7cbe72b8b63de2da329 · googleapis/nodejs-logging-bunyan
Node 10: log entries appear as string in textPayload, not structured in jsonPayload · Issue #291 · googleapis/nodejs-logging-bunyan
Getting execution-id / trace? · Issue #591 · googleapis/nodejs-logging
Log 'jsonPayload' in Firebase Cloud Functions - Stack Overflow
別に今は @google-cloud/logging を使っていて自前で Metadata 作る必要ない...
これを参考にしたブログ記事がいくつかあって不思議、昔は必要だったんかな
Stackdriver Traceを強制的に出力する · Issue #72 · gcpug/nouhau
GAE の話題だけど試したい
#dev #GoogleCloud